package com.mf.utils;

/**
 * @Author: lmf
 * @Create: 2024/5/30 13:09
 * Description:枚举工具类
 */
public class EnumUtils {
    /**
     * 检查给定的枚举类中是否存在具有指定字段值的枚举常量。
     */
    public static <T extends Enum<T>> boolean existsInEnum(Class<T> emuClass, Integer value) {
        return  existsInEnum(emuClass, value, "value");
    }

    /**
     * 检查给定的枚举类中是否存在具有指定字段值的枚举常量。
     */
    public static <T extends Enum<T>> boolean existsInEnum(Class<T> emuClass, String value) {
        return  existsInEnum(emuClass, value, "value");
    }

    /**
     * 检查给定的枚举类中是否存在具有指定字段值的枚举常量。
     */
    public static <T extends Enum<T>> boolean existsInEnum(Class<T> emuClass, Integer value, String fieldName) {
        // 遍历枚举类中的所有枚举常量
        for (T enumConstant : emuClass.getEnumConstants()) {
            Integer enumValue = null;
            try {
                // 尝试获取枚举常量的指定字段值
                enumValue = (Integer) enumConstant.getClass().getField(fieldName).get(enumConstant);
                // 比较字段值，如果匹配则返回true
                if (enumValue.equals(value)) {
                    return true;
                }
            } catch (IllegalAccessException | NoSuchFieldException e) {
                // 如果访问字段失败，返回false
                return false;
            }
        }

        // 如果遍历完所有枚举常量都没找到匹配的，返回false
        return false;
    }

    /**
     * 检查给定的枚举类中是否存在具有指定字段值的枚举常量。
     *
     * @param emuClass 枚举类的Class对象，该枚举类必须是Enum的子类。
     * @param value 要查找的字段值。
     * @param fieldName 枚举常量中要比较的字段名。
     * @return 如果存在具有指定字段值的枚举常量，则返回true；否则返回false。
     */
    public static <T extends Enum<T>> boolean existsInEnum(Class<T> emuClass, String value, String fieldName) {
        // 遍历枚举类中的所有枚举常量
        for (T enumConstant : emuClass.getEnumConstants()) {
            String enumValue = null;
            try {
                // 尝试获取枚举常量的指定字段值
                enumValue = (String) enumConstant.getClass().getField(fieldName).get(enumConstant);
                // 比较字段值，如果匹配则返回true
                if (enumValue.equals(value)) {
                    return true;
                }
            } catch (IllegalAccessException | NoSuchFieldException e) {
                // 如果访问字段失败，返回false
                return false;
            }
        }

        // 如果遍历完所有枚举常量都没找到匹配的，返回false
        return false;
    }

}
